package com.lsy.on_line.zaixian.service.impl;

import com.lsy.on_line.zaixian.config.CacheKeyManager;
import com.lsy.on_line.zaixian.model.entity.Banner;
import com.lsy.on_line.zaixian.model.entity.Video;
import com.lsy.on_line.zaixian.mapper.VideoMapper;
import com.lsy.on_line.zaixian.service.IVideoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lsy.on_line.zaixian.utils.BaseCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ShiYuan
 * @since 2022-07-24
 */
@Service
public class VideoServiceImpl extends ServiceImpl<VideoMapper, Video> implements IVideoService {

    @Autowired
    private VideoMapper videoMapper;
    @Autowired
    private BaseCache baseCache;


    /**
     * 全部视频列表
     * @return
     */
    @Override
    public List<Video> videoList() {

        try {
            //先根据INDEX_BANNER_KEY这个key去找缓存中的视频列表
            Object cacheObj = baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_VIDEO_LIST_KEY,()->{
                //如果没在缓存中找到 就去数据库中获取视频列表返回
                List<Video> list = videoMapper.videoList();
                System.out.println("从数据库中获取视频列表");
                return list;
            });
            //判断是否在缓存中拿到视频列表,成功在缓存中获取就直接强制转换 返回视频列表,未成功 则返回上层lambda表达式从数据库获取
            if(cacheObj instanceof List){
                List<Video> videoList = (List<Video>) cacheObj;
                return videoList;
            }
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        //任何位置出现异常直接返回null,也可以返回自定义 "兜底数据" 进行业务系统降级 防止系统数据库崩溃造成的无数据返回
        return null;
    }

    /**
     * 首页轮播图
     * @return
     */
    @Override
    public List<Banner> bannerList() {

        try {
            //先根据INDEX_VIDEO_LIST_KEY这个key去找缓存中的轮播图列表
          Object cacheObj = baseCache.getTenMinuteCache().get(CacheKeyManager.INDEX_BANNER_KEY,()->{
                //如果没在缓存中找到 就去数据库中获取轮播图列表返回
                List<Banner> list = videoMapper.bannerList();
                System.out.println("从数据库中获取轮播图列表");
                return list;
            });
            //判断是否在缓存中拿到轮播图列表,成功在缓存中获取就直接强制转换 返回轮播图列表,未成功 则返回上层lambda表达式从数据库获取
            if(cacheObj instanceof List){
                List<Banner> bannerList = (List<Banner>) cacheObj;
                return bannerList;
            }
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        //任何位置出现异常直接返回null
        return null;
    }

    /**
     * 查询视频详情，包括章节，集数等全部信息
     * @param videoId
     * @return
     */
    @Override
    public Video findDetailById(int videoId) {
        //单独构建一个缓存key,每一个视频的key都不同 (与其他加缓存的区别就是需要根据每一个视频获取相应视频详情)
        String videoCacheKey = String.format(CacheKeyManager.VIDEO_DETAIL,videoId);
        try {
            //先根据VIDEO_DETAIL这个key去找缓存中的视频详情
            Object cacheObj = baseCache.getOneHourCache().get(videoCacheKey,()->{
                //如果没在缓存中找到 就去数据库中获取视频详情返回
                Video video = videoMapper.findDetailById(videoId);//需要使用mybatis实现联表关联复杂查询
                System.out.println("从数据库中获取视频详情");
                return video;
            });
            //判断是否在缓存中拿到视频详情,成功在缓存中获取就直接强制转换 返回视频详情,未成功 则返回上层lambda表达式从数据库获取
            if(cacheObj instanceof Video){

                Video video = (Video) cacheObj;
                return video;
            }
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        //任何位置出现异常直接返回null
        return null;
    }
}
